検証: nvarcharからvarcharに型変更する
from 検証: varcharからnvarcharへ型変更する手順
nvarcharからvarcharに型変更する場合はあまりないだろうけど、結構困りそう
1. nvarcharの列の情報を確認する
code:select_INFORMATION_SCHEMA.sql
SELECT
COLUMN_NAME AS column_name,
DATA_TYPE AS type,
CHARACTER_SET_NAME AS character_set,
COLLATION_NAME AS collation,
CHARACTER_MAXIMUM_LENGTH AS max_len,
CHARACTER_OCTET_LENGTH AS octet_len
FROM
tempdb.INFORMATION_SCHEMA.COLUMNS
WHERE
COLUMN_NAME = 'nvc';
table:result
column_name type character_set collation max_len octet_len
nvc nvarchar UNICODE Japanese_CI_AS -1 -1
2. nvarcharにUNICODE文字を挿入する
code:sql
TRUNCATE TABLE #T;
INSERT INTO #T(nvc, text) VALUES (N'a', N'');
INSERT INTO #T(nvc, text) VALUES (N'愛', N'');
INSERT INTO #T(nvc, text) VALUES (N'噶', N'とから列島の「か」、UTF-8 3バイト、Unicodeに収録されているのでNなしでINSERTすると?になる');
INSERT INTO #T(nvc, text) VALUES (N'俱', N'');
INSERT INTO #T(nvc, text) VALUES (N'龐', N'龐統の龐、UTF-8 3バイト、Unicodeに収録されているのでNなしでINSERTすると?になる');
INSERT INTO #T(nvc, text) VALUES (N'彧', N'荀彧の彧、UTF-8 3バイト、Shift_JISにはないがCP932にはあるのでNなしでINSERTしても表示される');
INSERT INTO #T(nvc, text) VALUES (N'昱', N'程昱の昱、UTF-8 3バイト、Shift_JISにはないがCP932にはあるのでNなしでINSERTしても表示される');
INSERT INTO #T(nvc, text) VALUES (N'邢', N'邢道栄の邢、UTF-8 3バイト、Unicodeに収録されているのでNなしでINSERTすると?になる');
INSERT INTO #T(nvc, text) VALUES (N'彅', N'草彅剛の彅、UTF-8 3バイト、Shift_JISにはないがCP932にはあるのでNなしでINSERTしても表示される');
INSERT INTO #T(nvc, text) VALUES (N'鷗', N'森鷗外の鷗、UTF-8 3バイト、Unicodeに収録されているのでNなしでINSERTすると?になる');
INSERT INTO #T(nvc, text) VALUES (N'𩸽', N'ほっけ、UTF-8でもUTF-16でも4バイト、サロゲート文字なのでNなしでINSERTすると??になる');
SELECT nvc
, LEN(nvc) AS length, DATALENGTH(nvc) AS data_length
, CAST(nvc AS varbinary(max)) AS bin
, text AS 備考
FROM #T;
table:result
nvc length data_length bin 備考
a 1 2 0x6100
愛 1 2 0x1B61
噶 1 2 0x7656 とから列島の「か」、UTF-8 3バイト、Unicodeに収録されているので(略)
俱 1 2 0xF14F
龐 1 2 0x909F 龐統の龐、UTF-8 3バイト、Unicodeに収録されているので(略)
彧 1 2 0x675F 荀彧の彧、UTF-8 3バイト、Shift_JISにはないがCP932にはあるので(略)
昱 1 2 0x3166 程昱の昱、UTF-8 3バイト、Shift_JISにはないがCP932にはあるので(略)
邢 1 2 0xA290 邢道栄の邢、UTF-8 3バイト、Unicodeに収録されているので(略)
彅 1 2 0x455F 草彅剛の彅、UTF-8 3バイト、Shift_JISにはないがCP932にはあるので(略)
鷗 1 2 0xD79D 森鷗外の鷗、UTF-8 3バイト、Unicodeに収録されているので(略)
𩸽 2 4 0x67D83DDE ほっけ、UTF-8でもUTF-16でも4バイト、サロゲート文字なので(略)
3. 型をnvarcharからvarcharに変更する
code:alter.sql
ALTER TABLE #T ALTER COLUMN nvc varchar(max);
table:result
コマンドは正常に完了しました。
code:select_INFORMATION_SCHEMA.sql
SELECT
COLUMN_NAME AS column_name,
DATA_TYPE AS type,
CHARACTER_SET_NAME AS character_set,
COLLATION_NAME AS collation,
CHARACTER_MAXIMUM_LENGTH AS max_len,
CHARACTER_OCTET_LENGTH AS octet_len
FROM
tempdb.INFORMATION_SCHEMA.COLUMNS
WHERE
COLUMN_NAME = 'nvc';
table:result
column_name type character_set collation max_len octet_len
nvc varchar cp932 Japanese_CI_AS -1 -1
4. varcharに変更した列を確認する
code:select.sql
SELECT nvc
, LEN(nvc) AS length, DATALENGTH(nvc) AS data_length
, CAST(nvc AS varbinary(max)) AS bin
, text AS 備考
FROM #T;
table:result
nvc length data_length bin 備考
a 1 1 0x61
愛 1 2 0x88A4
? 1 1 0x3F とから列島の「か」、UTF-8 3バイト、Unicodeに収録されているので(略)
? 1 1 0x3F
? 1 1 0x3F 龐統の龐、UTF-8 3バイト、Unicodeに収録されているので(略)
彧 1 2 0xFAB9 荀彧の彧、UTF-8 3バイト、Shift_JISにはないがCP932にはあるので(略)
昱 1 2 0xFA63 程昱の昱、UTF-8 3バイト、Shift_JISにはないがCP932にはあるので(略)
? 1 1 0x3F 邢道栄の邢、UTF-8 3バイト、Unicodeに収録されているので(略)
彅 1 2 0xFA67 草彅剛の彅、UTF-8 3バイト、Shift_JISにはないがCP932にはあるので(略)
? 1 1 0x3F 森鷗外の鷗、UTF-8 3バイト、Unicodeに収録されているので(略)
?? 2 2 0x3F3F ほっけ、UTF-8でもUTF-16でも4バイト、サロゲート文字なので(略)
UNICODE文字はなんらか手当てをしてあげないと?になってしまう